package day05

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object CustomSortDemo {
  def main(args: Array[String]): Unit = {
    //先定义数据。
    /**
      * 第一种方法：
      * （1）先创建样例类封装数据:case class .....
      * （2）另创建一个Object（注意不能是Class）文件创建一个类：用来将样例类进行隐式转换为Ordering并且实重写compart比较方法的。
      *     专门用来隐式转换（并且要创建Ordering排序类new Ordering[数据类]{ 重写比较方法comparr(比较的参数为两个数据类)} ）。
      *     implicit val xxx = new Ordering[...] {..compart方法.}
      * （3）在原本的文件中import 引言该类。然后先调用 sortBy方法(  返回 为 将元祖数据封装到 样例类中 。 )  这样就会隐式转换自动调用比较方法
      *
      * 第二种方法：
      * （1）先创建样例类封装数据，并且直接让样例类继承排序类Ordered[样例类]{ 重写compare方法 }
      *     case class 样例类名(比较字段) extends Ordered[本样例类] { 重写compare方法 }
      * （2）同第一种方法的（3），只不过不用import。
      */
    val conf: SparkConf = new SparkConf().setAppName("customsortDemo").setMaster("local[2]")
    val sc = new SparkContext(conf)
    val girlInfo: RDD[(String, Int, Int)] = sc.parallelize(List(("ye", 99, 33), ("fu", 80, 35), ("hao", 80, 32)))
    //第一种排序方法
//    import MyPref.girlOrdering
//    val res: RDD[(String, Int, Int)] = girlInfo.sortBy(x => Girl(x._2, x._3), false)

    //第二种排序方法
    val res: RDD[(String, Int, Int)] = girlInfo.sortBy(x => Girl(x._2, x._3), false)
    println(res.collect().toBuffer)
    sc.stop()

  }
}

//第一种排序方法
//case class Girl(one:Int, two:Int)

//第二种排序方法
case class Girl(one: Int, two: Int) extends Ordered[Girl] {
  override def compare(that: Girl): Int = {
    if (this.one != that.one)
      return this.one - that.one
    else
      return this.two - that.two
  }
}